[レポート] ROB202: AWS RoboMakerによるロボットアプリ開発ワークショップ 「迷い犬を探せ」 #reinvent
はじめに
re:Invent2018にて、ROB202-R 「Use AWS RoboMaker to Develop a Robot Application to Track and Find Fido」というAWS RoboMakerのワークショップをレポートします。AWS RoboMakerによるロボットアプリケーションのビルドからシミュレーションの実行までを体験することができました。
公式の概要は下記の通りです。
AWS RoboMaker enables you to easily develop complex robot applications. In this workshop, we introduce the capabilities of RoboMaker to develop ROS robot and simulation applications, natively integrate with other AWS services such as Amazon CloudWatch and Amazon Kinesis video streams, and build and compile these applications. Upon completion, you will launch a simulated TurtleBot3 wheeled robot to look at different images within an enclosed space utilizing Amazon Rekognition’s object detection features, and track down that pesky pooch’s photo! After the workshop, you will have a fundamental understanding of the development process for robotic applications using AWS RoboMaker.
スライド
ワークショップ概要
会場はテーブル席が用意されており、自分のノートPCと自分のAWSアカウントを使用して、用意されたチュートリアルを実施していくというスタイルです。最初に概要と流れを20分ほどで説明された後は、時折補足説明があるのみで、各自でタスクをこなしていく感じでした。会場にはスタッフが何人もおり、助けが必要な時にはすぐにサポートしてもらえます。
アジェンダ
- ワークショップの内容
- AWS RoboMakerの概要
- ROSについて
AWS RoboMakerの概要
まずはAWS RoboMakerの概要について、何ができるのかの解説。
- ROS (Robot OS)とクラウドサービスが連携するための拡張
- 開発環境
- シミュレーション環境
- ロボット群の管理
そして、開発環境ならびにシミュレーション環境の構成。
- 仮想 TurtleBot3 Waffle Pi
- カメラとLiDARを搭載
- 六角形の壁の中心に配置
- 開始コマンドを待っている
- ゴール探索
- 時計回りに回転
- 画像を取得し、Amazon Rekognitionで認識
- 画像が犬でなければ、次の壁に続ける
- ROSにAWSサービスを統合
- Kinesis Video Stream
- Amazon CloudWatch Logs
- Amazon Rekognition
ワークショップ
概要の説明後、さっそく作業が始まります。
会場で掲示されたURLから、資料とコードがふくまれたZIPファイルをダウンロードし、資料の内容に沿って作業を進めていきます。コードを書くわけではなく、ダウンロードしたデモを稼動する環境を自分のAWSアカウントに作成していく感じです。
資料
下記からダウンロードできます。資料、ならびにロボットとシミュレーションのコードが含まれています。これを自分のアカウントでRoboMakerの環境で動かすことがワークショップのゴールです。
http://bit.ly/dog-finder-workshop
実施するチュートリアルの中身は2題用意されていました。一つはHello World的なもの。もう一つが表題にある「犬を探す」ロボットを作成するというものです。このレポートでは後者の内容を紹介します。
主役は、ビデオカメラが取り付けられたタートルロボットです。六角形の枠で囲まれた壁の中にロボットが置かれています。まわりの壁には風景を模した写真が貼られており、ロボットはその中でぐるぐると回ります。そしてビデオカメラで映った映像から犬を見つけ出すというタスクを実行し、発見したらイベント通知を行う、というストーリーです。
準備
ダウンロードしたに含まれている手順書を確認しながら進めていきます。まずは下準備です。自分のAWSアカウントで下記を作成&メモしておきます。
- 使用するリージョンはオレゴン(us-west-2)
- S3バケットを作成し、バケット名をメモ(バケット名はユニークにする) (df-bucket-XXXXXXXXXXXX)
- Kinesis Video Streamで、"roboMaker_TurtleBot3"という名称のストリームを作成(保存期間は1時間)
- デオフォルトVPCで、インターネットアクセス可能なサブネット二つを確認し、その二つのサブネット名をメモ
- セキュリティグループ名をメモ
IAM Roleを作成
AMCでIAM Roleの画面を開き、RoboMakerWorkshop2018という以下のポリシーをアタッチしたIAM Roleを作成します。
- AmazonS3ReadOnly
- CloudWatchFullAccess
- AmazonRekognitionFullAccess
- AmazonKinesisVideoStreamsFullAccess
そして、信頼関係を付与します。デフォルトでec2の部分をrobomakerと書き換えて、"robomaker.amazonaws.com" とします。
以上、IAM Roleが作成できたら、ARNをメモしておきます。
RoboMakerに環境を作成
マネージメントコンソールで、AWS RoboMakerを開きます。リージョンは、Oregonを使用するよう指定がありました。
Create Development Environmentをクリックします。
Nameにworkshopを。Instance typeとしてm4.largeを選択します。あとはデフォルトそのままにして、Createボタンを押します。
Open Environmentボタンをクリックします。環境作成に数分を要しますが、しばらくするとCloud9環境が開きます。
コードをアップロード
ワークショップ資料と一緒に含まれていた、アプリケーションソースのzipファイル DogFinder.zip をCloud9のファイルペインにドラッグアンドドロップします。そうするとCloud9環境にコピーされます。 zipファイルがコピーできたら、Cloud9のターミナル内でunzipコマンドでzipファイルを解凍します。
$ unzip DogFinder.zip
解凍すると、中にはRobotAppのワークスペースとSimAppのワークスペースが含まれています。これらを別々にビルドするために、+ボタンを押して、ターミナルを三つ開いておきます。
最初のターミナルで、RobotAppをビルドします。数分かかりますので完了するまで待ちます。
cd DogFinder/robot_ws/ sudo apt-get update rosdep install --from-paths src --ignore-src -r -y colcon build
成功したら、もう一つのターミナルで、SimulationAppをビルドします。こちらは短時間で終了します。
cd DogFinder/simulation_ws/ rosdep install --from-paths src --ignore-src -r -y colcon build
RobotAppをビルドしたターミナルで、下記を実行してバンドルを作成します。こちらは数分がかかります。ウォーニングが出ますが無視します。
colcon bundle
同様にSimulationAppをビルドしたターミナルで、下記を実行します。
colcon bundle
バンドル(tar.gz)ファイルができているはずですので、できあがったRobotAppのバンドルをS3バケットにコピーします。バケット名は初めに作成したバケット名を使用します。
aws s3 cp bundle/output.tar.gz s3://df-bucket-XXXXXXXXXXXX/dogfinder/output-robot.tar.gz
同様にSimulationAppのバンドルをS3バケットにコピーします。
aws s3 cp bundle/output.tar.gz s3://df-bucket-XXXXXXXXXXXX/dogfinder/output-sim.tar.gz
ワークショップで実施したときは、このときコピーが進まずタイムアウトとなるエラーが発生しました。
$ aws s3 cp bundle/output.tar.gz s3://df-tt-bucket/dogfinder/output-robot.tar.gz upload failed: bundle/output.tar.gz to s3://df-tt-bucket/dogfinder/output-robot.tar.gz ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
如何ともしがたく、しばらく困っていたのですが、途中で下記のワークアラウンドが示されました。AWS SDKをアップデートすることでエラーが解消しました。(現時点最新の環境ではこの対応は不要なようです)
$ sudo pip install -U awscli
ジョブ作成
プロジェクトファイルに用意されているファイルsubmit_job.sh
をCloud9環境で開いて、ファイル先頭にある設定を書き換えます。
デフォルトでこうなってる箇所を、
export BUCKET_NAME="your bucket name" export SUBNETS="your_subnet1,your_subnet2" export SECURITY_GROUP="your_security_group" export ROLE_ARN="your iam role ARN here"
メモっておいたARNやバケット名で書き換えます。
export BUCKET_NAME="df-bucket-XXXXXXXXXXXX" export SUBNETS="subnet-60a9XXXX,subnet-e150XXXX" export SECURITY_GROUP="sg-f979XXXX" export ROLE_ARN="arn:aws:iam::XXXXXXXXXXXX:role/RoboMakerWorkshop2018"
三つめのターミナルを使って、下記コマンドを実行します。
DogFinder/submit_job.sh
そうすると、RoboMaker環境にRobotAppとSimulationAppが作成され、そしてSimulation Jobが追加されます。AWS RoboMakerの画面を開くと確認できます。
Simulation JobはしばらくPendingとなり起動に数分を要します。
ジョブが起動し、StatusがRunningになったら、シミュレータを開くことができます。
Gazeboにチェックを入れてOpenしてみましょう。
中心部を拡大すると、六角形の壁に囲まれたロボットが表示されています。
AMCでKinesis Video Streamを開くと、橋の写真が写っているのがわかります。これはロボットが向いている壁にある写真が見えています。
シミュレーション環境でターミナルを開きます。
そして下記のコマンドを送ると、ロボットが動き出します。
rostopic pub --once /df_action std_msgs/String 'start'
メッセージを受けてロボットが動作を開始し、Gazeboの画面でロボットが回転していることがわかります。
また、Kinesis Video Streamの動画で、ロボットの回転に従って画像が動いているのがわかります。
最後に犬の写真が写って回転が停止します。
CloudWatch Logを確認すると、犬を発見したという通知が送られてきているのがわかります。
クリーンアップ
ワークショップ終了後は下記のリソースを削除しておきます。
- S3バケットを削除
- AWS RoboMakerのシミュレーションジョブが終了していること
- AWS RoboMakerからCloud9環境を削除
- CloudWatch Logsからログの削除
- Kinesis Video Streamからストリームを削除
- 作成したIAM Roleを削除
さいごに
新サービスAWS RoboMakerの開発環境とシミュレーション環境の使い方、そしてAWSのクラウドサービスとの連携を、実際に動かして確認することができました。ワークショップの内容は実際に試すことができますので、資料をダウンロードしてRoboMakerをぜひ試してみてください。
参考
- スライド https://www.slideshare.net/AmazonWebServices/use-aws-robomaker-to-develop-a-robot-application-to-track-and-find-fido-rob202r1-aws-reinvent-2018
- ワークショップの資料とコード http://bit.ly/dog-finder-workshop